package com.eliaukjq.xunlianying;

/**
 * @Author : 佩萁
 * Description :
 * @Create : 2024/7/20 - 11:29
 */

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 锁等待示例类，展示如何使用ReentrantLock进行线程同步。
 */
public class LockWaitingExample {
    /**
     * 使用ReentrantLock作为同步机制的锁。
     */
    private static final Lock lock = new ReentrantLock();

    /**
     * 程序入口点。
     * 创建两个线程，线程1先获取锁并休眠5秒，线程2尝试获取锁并在获取后打印信息。
     * 这个示例展示了锁的使用以及线程之间的同步与等待。
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            lock.lock(); // 获取锁
            try {
                Thread.sleep(5000); // 持有锁5秒，模拟长时间占用锁的操作
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt(); // 重新设置中断状态
            } finally {
                lock.unlock(); // 释放锁 这里如果不释放会导致下面的线程获取不到从而进入死锁
            }
        });

        Thread thread2 = new Thread(() -> {
            lock.lock(); // 尝试获取锁
            try {
                System.out.println("Thread 2 acquired the lock."); // 在获取锁后执行相应操作
            } finally {
                lock.unlock(); // 最终确保释放锁
            }
        });

        thread1.start(); // 启动线程1
        thread2.start(); // 启动线程2
    }
}
